// 递归 : 函数自己调自己
/**
 * 1. 必须要有结束的条件 ,return  没有会报错
 */
let i = 0
function fn(){
 i++
 console.log(i)
 if(i == 3){
    return 
 }
 fn()
}
fn()


/**
 * 递归结合   setTimeout  实现  setInterval  效果
 */
// function time(){
//     console.log(new Date().toLocaleString()) // 2023/9/21 11:04:53
//     setTimeout(time,1000)
// }
// setTimeout(time,1000)

/**
 * 递归  实现  深拷贝  核心 ： 利用函数递归
 * 1。先判断拷贝的是  数组  还是对象
 * 2.遍历
 * 3.如果 属性值 是引用数据类型，则在此调用 递归函数
 * 4.如果 属性值是 基本数据类型，直接赋值
 */ 

const obj = {
    name:'青雀',
    family:{
        father:'符玄'
    }
}
// 封装递归函数
function cloneDeep(obj){
//  1.判断 拷贝的是 对象还是数组

//  if(Array.isArray(obj))
//     let newObj
//     newObj = []
//  }
//  else{
//     newObj = {}
//  }

//  三元表达式

let newObj = Array.isArray(obj) ? [] :{}
 
// 2. 遍历老对象，把属性赋值给新对象
for(let k in obj){
    console.log(k,obj[k])

    // if(typeof obj[k] === 'object'){
    //   深拷贝
    //     newObj[k] = cloneDeep(obj[k])
    // }else{
    //      属性    ：  属性值    （把旧对象 里面的值  复制给 新对象） 这是个浅拷贝
    //     newObj[k] = obj[k]
    // }
    newObj[k] = typeof obj[k] === 'object' ? cloneDeep(obj[k]) : obj[k]
}
return  newObj
}

const newObj = cloneDeep(obj)
console.log(newObj) //  { name: '青雀', family: { father: '符玄' } }